/**
 * @function 进制转换
 * @encode utf-8
 * @copyright (C) lijun
 * @file numeric.js
 * @author lijun
 * @version 1.0
 * @date 2010-3-6
 */

XLib.Numeric = {
    //全局数组对象，用于数值转换
    digits : [
        '0', '1', '2', '3', '4', '5',
        '6', '7', '8', '9', 'a', 'b',
        'c', 'd', 'e', 'f', 'g', 'h',
        'i', 'j', 'k', 'l', 'm', 'n',
        'o', 'p', 'q', 'r', 's', 't',
        'u', 'v', 'w', 'x', 'y', 'z'
    ],
    /**
     *@function 转换成一个无符号的数值字符串
     *@param i 数值
     *@param shift 位移
     *@return 转换后的数值字符串
     */
    toUnsignedString : function(i, shift)
    {
        //缓冲区，初始为32
        var buf = [
            0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0
        ];
        var charPos = 32;
        var radix = 1 << shift;
        var mask = radix - 1;
        var numStr = "";
        do
        {
            buf[--charPos] = this.digits[i & mask];
            i >>>= shift;
        }while(i != 0)
        numStr = buf.join("");
        return numStr;
    },
    /**
     *@function 数值检查
     *@param i 数值
     *@return 数值/NaN
     */
    checkNumber : function(i)
    {
        if(!i || typeof(i) == "undefined"){
            return NaN;
        }
        if(!/^[0-9]+$/g.test(i)){
            return NaN;
        }
        return i;
    },
    /**
     *@function 转换成二进制
     *@param i 需要转换的数值
     *@return 二进制数
     */
    toBinaryString : function(i)
    {
        if(isNaN(this.checkNumber(i)))
        {
            return NaN;
        }
        return this.toUnsignedString(i,1);
    },
    /**
     *@function 转换成八进制
     *@param i 需要转换的数值
     *@return 八进制数
     */
    toOctalString : function(i)
    {
        if(isNaN(this.checkNumber(i)))
        {
            return NaN;
        }
        return this.toUnsignedString(i,3);
    },
    /**
     *@function 转换成十六进制
     *@param i 需要转换的数值
     *@return 十六进制数
     */
    toHexString : function(i)
    {
        if(isNaN(this.checkNumber(i)))
        {
            return NaN;
        }
        return this.toUnsignedString(i,4);
    }
};